home *** CD-ROM | disk | FTP | other *** search
/ United Public Domain Gold 2 / United Public Domain Gold 2.iso / utilities / pu696.dms / pu696.adf / XPR_Libs / xprzmodem.doc < prev    next >
Text File  |  1993-06-28  |  35KB  |  683 lines

  1.  
  2.                     Documentation for XPRZModem.library
  3.               Version 2.10, 12 February 1991, by Rick Huebner
  4.  
  5. |---
  6. |           Update comments for XprZmodem.Library
  7. |    Version 2.50 Update, 15 November 1991, by William M. Perkins
  8. |    Version 2.51 bug fix, 29 January 1992, by John Tillema
  9. |    Version 2.52 recompiled, 6 March 1992, by William M. Perkins
  10. |    Version 2.54 Update, 28 June 1993, by Olaf `Olsen' Barthel
  11. |      Proto additions for the SAS 5.10B Compiler by Jim Cooper
  12. |---
  13.  
  14. |---
  15. |    All of my additions to this documentation are indicated by
  16. |  <--  this left margin braketing.   -WMP-
  17. |---
  18.  
  19. 1.  Introduction (or "What is this thing, anyway?")
  20. ---------------------------------------------------
  21.  
  22.      XPRZModem.library is an Amiga shared library (with full Lattice C
  23. source code) which provides ZModem file transfer capability to any
  24. XPR-compatible communications program.  The XPR external protocol standard
  25. describes an interface method which allows various file transfer protocols
  26. to be implemented as Amiga shared libraries which may then be used
  27. interchangeably in any compatible communications program.  This takes a
  28. heavy load off of the comm program author, who no longer has to support
  29. scads of different file transfer protocols (many of which are quite tricky
  30. to code) in their program in order to make it widely useful and popular.
  31. The comm program is also smaller and more efficient as a result, since all
  32. those obscure protocols (you know, the ones *you* don't need) are no longer
  33. taking up space.  The XPR standard also helps users, who can mix and match
  34. their favorite file transfer protocols (and implementations thereof) with
  35. their favorite comm programs.  And when new protocols are invented, the
  36. user simply plugs in a new library, and voila!, it's ready to use.
  37. Hopefully, making protocols easy to support will allow more and better comm
  38. programs to be written, as authors can concentrate on their programs
  39. instead of constantly re-inventing the wheel.
  40.  
  41.      Of course, for all of this wonderful stuff to happen, there needs to
  42. be a good selection of these XPR protocol libraries available to the
  43. public.  It's the classic chicken-and-egg problem; comm program authors
  44. won't be motivated to support the XPR standard unless there are a goodly
  45. number of protocols available for it.  And other programmers won't be
  46. motivated to write XPR protocol libraries until there are a goodly number
  47. of comm programs which can use them.  In an effort to do my bit [ B^) ] for
  48. the Amiga community, which has given me so many neat toys to play with over
  49. the past few years, I decided to try and help get the ball rolling.
  50.  
  51.      Hopefully, the early availability of a ZModem library will help
  52. stimulate interest in the XPR standard, resulting in better Amiga telecomms
  53. for all of us.  And by making my source code PD, I hope to help others
  54. interested in writing XPR protocol libraries by giving them some serious
  55. example code.  Also, having ZModem library code readily available to John
  56. Q. Hacker should help ensure a steady stream of new lemon-fresh enhanced
  57. ZModem libraries (with enzymes) for all of us to use in the future.
  58.  
  59.      Of course, no discussion of the XPR standard would be complete without
  60. giving proper credit to the author, Willy Langeveld of the Stanford Linear
  61. Accelerator Center.  Many thanks are due him for this effort.  If you have
  62. any further questions about the XPR standard, be sure and download the spec;
  63. it should be available on BIX (since he's a sysop there), or on most other
  64. major systems.  And I'll try to keep the current version available on my
  65. BBS, as well.
  66.  
  67.      All files in this archive which are not copyrighted are hereby
  68. released to the public domain (which they were anyway, by way of not being
  69. copyrighted, but I want to make sure YOU realize that).  Do as you like
  70. with them.  Please make lots of copies and distribute them all over the
  71. place, and make lots of derivative works, and everything!  Heck, you can
  72. even publicly perform and/or display this code if you can figure out how...
  73.  
  74.  
  75.  
  76. 2.  Installation (OK, enough chatter; let's get to work)
  77. --------------------------------------------------------
  78.  
  79.      Couldn't be easier.  Just copy the xprzmodem.library file into your
  80. LIBS: directory.  All XPR-compatible comm programs should provide a way for
  81. you to select which XPR protocol you wish to use, either by giving you a
  82. file requester showing LIBS:xpr*.library, or by automatically detecting
  83. these libraries and adding them into their menus.
  84.  
  85. WARNING:  Versions of VLT prior to revision 4.107 had a bug in the
  86. xpr_sflush() routine which caused random Guru 3 crashes on some systems.  If
  87. you're using a version of VLT older than 4.107, it would be a good idea to
  88. upgrade to the latest rev.  Besides, there's a bunch of new features you're
  89. missing, anyway...
  90.  
  91. ANOTHER WARNING:  Versions of VLT prior to 5.034 had a bug in the
  92. xpr_sread() function which caused them to (at least sometimes) fail to
  93. return any bytes received so far when an xpr_sread() call timed out.  This
  94. version of XPRZModem.library requires VLT version 5.034 or later.  (Yes,
  95. Willy, it really was broken B-))
  96.  
  97. |---
  98. |    XprZmodem.Library version 2.50 and 2.52 tested with WTerm version
  99. |    0.82 and Willy's term program, VLT version 5.045.  No problems
  100. |    occurred.  It should work fine with any term program that was able
  101. |    to work with the version 2.10 of XprZmodem.Library.    -WMP-
  102. |---
  103.  
  104. |---
  105. |    xprzmodem.library v2.54 *requires* Kickstart 2.04 or higher to
  106. |    work properly! Trying to use this library with any previous
  107. |    operating system revision will most certainly fail!
  108. |    All library texts are now localized, i.e. if a translation
  109. |    table for you preferred system language is available, the
  110. |    library will issue error messages and such in it. As of this
  111. |    writing only a German translation is available. I have included
  112. |    a blank catalog translation file (zmodem_blank.ct) for your
  113. |    convenience; feel free to translate it to your preferred
  114. |    language and mail it to me (see the address at the end of this
  115. |    document). It will be included in the next release.
  116. |---
  117.  
  118. 3.  Options
  119. -----------
  120.  
  121.      The XPR standard lays out two ways for the comm program user to
  122. specify options for the XPR protocol.  The more primitive option is for the
  123. comm program to provide a method of passing an option string to the XPR
  124. library before transferring files.  The precise format and usage of this
  125. option string is left up to the XPR protocol author; the comm program just
  126. sends it verbatim.  If an environment variable is found with the same name
  127. as the XPR protocol (i.e. there's a file in the ENV: directory called
  128. "xprzmodem"), the comm program is supposed to use this string (contents of
  129. file) to initialize the protocol options.  Also, a menu option or some such
  130. should normally be provided which will allow the user to be prompted for
  131. the option string interactively.
  132.  
  133.      Version 2.0 of the XPR standard created a new, more sophisticated way
  134. for the comm program user to specify XPR options.  If the comm program
  135. supports it, the XPR library can give the comm program a list of option
  136. prompts, and the comm program can then let the user interactively set the
  137. various options individually, possibly even using nice gadgets and stuff.
  138.  
  139.      In any case, no matter how your particular comm program feels like
  140. handling it, these are the options supported by this implementation of
  141. ZModem:
  142.  
  143.           T{Y|N|?|C}   Text translation mode:
  144.              TY = Text Yes; if receiving, translate CR/LF pairs or solo
  145.                   CR chars to normal Amiga LF chars.  Ignore data past ^Z.
  146.                   If sending, suggests to receiver that they should receive
  147.                   this file in text mode.
  148.              TN = Text No; receive file verbatim, without changes.  If
  149.                   sending, suggest to receiver that they receive this
  150.                   file verbatim, without translations.
  151.              T? = Text status unknown; if receiving, use sender's
  152.                   suggestion as to whether to do EOL translations or not.
  153.                   If sending, tell receiver to use default mode, 'cause we
  154.                   don't know either.
  155.              TC = Text mode set by Comm program; the library asks the comm
  156.                   program whether or not to use Text mode for each file.
  157.                   If the comm program doesn't support the necessary
  158.                   xpr_finfo() call, or if the call fails, this option acts
  159.                   like T?.  From the user's point of view, what this option
  160.                   normally does is set the Text mode to match the comm
  161.                   program's built-in text/binary/end-of-line/translation
  162.                   mode, if any.
  163.  
  164.           O{Y|N|R|S}  Overwrite mode:
  165.              OY = Overwrite Yes; if about to receive file with same name as
  166.                   one which already exists, delete the old file and receive
  167.                   the new file in its place.
  168.              ON = Overwrite No; if about to receive file with same name as
  169.                   one which already exists, append ".dup" onto the name of
  170.                   the new file to keep them separate.
  171.              OR = Overwrite Resume; if about to receive file with same name
  172.                   as one which already exists, resume receiving file data
  173.                   from the current end of the existing file.
  174.              OS = Overwrite Skip; if (etc.), tell sender never mind, skip
  175.                   this file, we don't want it.  Batch transfers will move
  176.                   on to the next file in the set, if any.
  177.  
  178.           Bnnn   Buffer size:
  179.              XPRZModem.library adds a layer of file I/O buffering in
  180.              addition to whatever the comm program may or may not provide.
  181.              This option sets the size of XPRZModem's file I/O buffer in
  182.              kilobytes.  The minimum value is 1 KB, for those using RAM
  183.              drives or fast hard drives, or those whose comm programs
  184.              already provide sufficient buffering.  The maximum value is
  185.              as much contiguous RAM as you have available in your Amiga.
  186.              If you specify more than is actually available, XPRZModem will
  187.              keep decrementing the buffer size requested by 1 KB until the
  188.              memory allocation works.  That way, if your RAM is too
  189.              fragmented to use the amount you request, XPRZModem simply
  190.              uses the largest block available.  Buffering is especially
  191.              helpful for floppy drive users; it keeps your drive from
  192.              continuously gronking and slowing things down all through the
  193.              transfer.  NOTE: Versions of VLT prior to 5.034 couldn't handle
  194.              buffer sizes >= 32 KB.  If you wanted to use larger buffers
  195.              before and couldn't, try again now.
  196.  
  197.           Fnnn   Frame size:
  198.              Although normally avoided, ZModem has the ability to require
  199.              an ACK to be sent from the receiver to the sender every X-many
  200.              data bytes.  Normally you don't want to use this feature,
  201.              because not waiting for ACKs is part of how ZModem works so
  202.              fast.  However, this feature can be very useful in conjunction
  203.              with file I/O buffering on slow devices (namely those floppy
  204.              drives).  If you set up a large I/O buffer to avoid gronking
  205.              your floppy so often, you'll find that when the buffer finally
  206.              *does* get around to being flushed that it can take a looonng
  207.              time; so long, in fact, that the delay can cause timeouts and
  208.              errors.  But if you set your ZModem to require the sender to
  209.              wait for an ACK every buffer's-worth of data, the sender will
  210.              politely wait for you to flush your buffer to the slow floppy
  211.              and send it an ACK saying it's OK to continue now.  This value
  212.              should be set to 0 to disable ACKs (normal mode), or set it to
  213.              the actual number of data bytes allowed between ACKs.  For
  214.              example, if you set B64 because of your floppy, you should
  215.              also set F65536.
  216.  
  217.           Ennn   Error count:
  218.              This allows you to set the number of sequential errors which
  219.              will be required to convince ZModem to abort the transfer.  The
  220.              normal value is 10, meaning that 10 errors must happen in a row
  221.              with no valid data being transferred in order to cause an abort.
  222.              This setting is provided for those using XPRZModem with a BBS,
  223.              who may wish to use a relaxed setting, or those with really
  224.              lousy phone lines who are desparate and patient enough to want
  225.              the transfer to continue in spite of horrible performance.
  226. |---
  227. |         M{N|R}   Encoding mode:
  228. |            MN  = Send data unencoded, this is the default for compatibility
  229. |                  with older xprzmodem.library revisions
  230. |            NR  = Run-length encode the data; a rather simple and inefficient
  231. |                  compression technique which may or may not be of any benefit
  232. |                  to you.
  233. |
  234. |         C{Y|N}   Escape control characters:
  235. |            CY = Prefix certain control characters with extra characters; useful
  236. |                 only for certain Unix ttys which have the unnerving habit of
  237. |                 stripping the ZModem escape commands. Not necessarily a good
  238. |                 idea to enable on the Amiga side unless the remote really requires
  239. |                 it.
  240. |            CN = Send the control characters as usual, do not extra work. This
  241. |                 is the default.
  242. |---
  243.           A{Y|N}   Auto-activate mode:
  244.              AY = Auto-activate Yes; if the comm program supports the
  245.                   ability, the library will automatically go into receive
  246.                   mode when the start of a ZModem download is detected.
  247.              AN = Auto-activate No; don't try to automatically start
  248.                   downloading, make the user activate it.
  249.  
  250.           D{Y|N}   Delete after sending:
  251.              DY = Delete Yes; delete each file after it has been
  252.                   sucessfully sent.
  253.              DN = Delete No; don't delete files after sending them.
  254.  
  255.           K{Y|N}   Keep partial files:
  256.              KY = Keep Yes; keep the fragment of a file received so far
  257.                   if file reception is aborted.  This allows you to use the
  258.                   Overwrite Resume option above to pick up where you left
  259.                   off on your next attempt.
  260.              KN = Keep No; delete any partially-received file after an
  261.                   aborted transfer.
  262.  
  263.           S{Y|N}   Send full directory path:
  264.              SY = Send path Yes; send full filenames including directory
  265.                   path to receiver.
  266.              SN = Send path No; send only simple filenames, not including
  267.                   directory path.
  268.  
  269.           R{Y|N}   Receive full directory path:
  270.              RY = Receive path Yes; use full filename exactly as received,
  271.                   instead of using the P option directory path.
  272.              RN = Receive path No; ignore received directory path (if any),
  273.                   use P option directory path instead.
  274.  
  275.           P{dir}   Path to use for received files:
  276.              Px = Store all received files in directory "x" if option RN
  277.                   set.  Ignored if option RY set.  "x" can be any valid
  278.                   existing directory, with or without trailing "/"
  279.                   (e.g. "Pdf0:", "PComm:hold", etc.).
  280.  
  281.      If setting the options via the option string method (either ENV: file
  282. or primitive comm program), note that the setting for each option must
  283. immediately follow the option character with no intervening characters
  284. ("TY", not "T Y" or "T=Y").  When setting multiple options at once,
  285. separate the options from each other with commas and/or spaces; for
  286. example, "TN,OR,F0".  You don't have to specify all options every time; the
  287. options you specify will be merged into the current option settings,
  288. replacing their old values.  Upper/lower case is not significant.  The
  289. default option settings if you don't change anything are "TC, ON, B16, F0,
  290. E10, AY, DN, KY, SN, RN, P".
  291.  
  292.      If the comm program supports the xpr_options() call added in version
  293. 2.0 of the XPR spec, you should be prompted for each option with a nice
  294. prompt message such as "Text mode (Y,N,?,C):" and possibly be able to use
  295. Intuition string and/or button gadgets instead of being stuck with the
  296. semi-cryptic option string format described above.
  297.  
  298.  
  299.  
  300. 4.  Serial port settings
  301. ------------------------
  302.  
  303.      ZModem (at least this implementation of it) requires that your serial
  304. port be set to 8 data bits, no parity, 1 stop bit.  This allows ZModem to
  305. send full 8-bit binary data bytes without having them munged on the way
  306. through the modem.  If your comm program supports the xpr_setserial()
  307. function, XPRZModem will use it to set your serial port to 8N1 before doing
  308. a transfer, and will set your port back the way it was again after it's
  309. done.  If your comm program doesn't support xpr_setserial(), you'll need to
  310. make sure it's in 8N1 mode yourself.
  311.  
  312.      ZModem works well in all serial port handshaking modes; none,
  313. XON/XOFF, or 7-wire/RTS/CTS.  Since any or all of those handshaking modes
  314. may be appropriate at different times, with different modems or remote
  315. systems, XPRZModem lets you set the handshaking mode and doesn't mess with
  316. it.
  317.  
  318.  
  319.  
  320. 5.  Receiving files
  321. -------------------
  322.  
  323.      Once you get the ZModem options and your serial port configuration set
  324. up properly, you're ready to actually use this thing (gasp!).  Receiving
  325. files via ZModem is quite simple.  First, get the file sender going by
  326. using whatever command it wants.  ZModem is a batch file transfer protocol,
  327. meaning that it's capable of transferring several files in a single
  328. exchange, so the remote system may allow you to specify multiple files to
  329. be sent to you at one time.  It may also allow you to use wildcard
  330. characters in the filename(s); this is all system dependant.
  331.  
  332.      This may be all you have to do.  If you specified option AY
  333. (auto-activate on), and your comm program supports it, XPRZModem should
  334. automatically activate at this point and start receiving your files.  If
  335. you specified AN, or your comm program doesn't support auto-activation, you
  336. should now use whatever option your comm program provides to activate file
  337. reception; this will usually be a menu option or button gadget.  Either
  338. way, once XPRZModem starts receiving files, it should automatically receive
  339. all of the files you specified into the proper directory as indicated by
  340. the R and P options.
  341.  
  342.      Make sure that you have set the ZModem options properly before
  343. starting the transfer; especially, make sure you only use TY if you know
  344. that all of the files being transferred in this batch are printable ASCII
  345. text files.  If you use TY on normal binary files like .ARCs or .ZOOs,
  346. they'll be mangled beyond use.
  347.  
  348.  
  349.  
  350. 6.  Sending files
  351. -----------------
  352.  
  353.      Sending files using ZModem is fairly straightforward.  First, activate
  354. the file receiver with whatever command the remote system requires.  You
  355. may or may not need to specify a filename or directory to the remote
  356. system; this depends on their implementation of ZModem.  Once the remote
  357. system is ready to receive files, activate your comm program's ZModem send
  358. function.  Your comm program will prompt you for which file(s) to send.
  359. Although ZModem is a batch protocol, your comm program may or may not allow
  360. you to specify multiple file names to be sent; also, wildcards may or may
  361. not be supported.  These decisions are up to the comm program author;
  362. ZModem will handle multiple files and wildcards if the comm program allows
  363. them.  Once you've specified the file name(s), the file(s) will be sent to
  364. the remote system.  Note that the T option serves only as a suggestion to
  365. the receiving system when sending files; the receiver makes the final
  366. decision as to whether to take your advice or to force the files to be
  367. received in text or binary mode.
  368.  
  369.      If errors occur while sending the file(s), you'll probably notice a
  370. small enhancement I made to the normal ZModem error recovery procedures.
  371. Normally, file transfer protocols have to compromise between efficient data
  372. transmission on good, clean phone lines and quick error recovery on bad,
  373. noisy phone lines.  If you pick a large packet size, you get high
  374. throughput on clean lines due to low packet overhead, but you have slow
  375. recovery times and large amounts of retransmitted data on noisy lines.  If
  376. you've used YModem on noisy lines you've seen this problem.  But, if you
  377. use small packets to reduce retransmitted data on noisy lines, you increase
  378. the amount of time the protocol spends sending packet overhead, and your
  379. throughput suffers.  The solution is to vary the block size according to
  380. the experienced error rate during the transfer.  That way you aren't stuck
  381. with a rigid packet length which will sometimes be the wrong size no matter
  382. what.  I came up with this idea back when I first wrote the ZModem code for
  383. Opus, and cleared it for future compatibility with ZModem's designer, Chuck
  384. Forsberg, back then.  Since then the basic concept has been extensively
  385. tested in the Opus BBS system, and has proven quite effective; it has also
  386. been incorporated into various other ZModem implementations over time.  The
  387. actual algorithm for deciding what size packets to use when is pretty much
  388. up to the protocol author; XPRZModem uses a modified version of the Opus
  389. algorithm which prevents locking the packet size at a small value when a
  390. large one-time burst of errors occurs.
  391.  
  392.  
  393.  
  394. 7.  Notes for comm program authors
  395. ----------------------------------
  396.  
  397.      That's pretty much everything you need to know in order to use
  398. XPRZModem properly.  Here are some notes for the "other" XPR standard
  399. users, namely the comm program authors:
  400.  
  401.      Certain XPR callback functions *must* be implemented by the comm
  402. program author in order for XPRZModem to be used.  If any of these
  403. functions are not supported by your comm program, XPRZModem will display an
  404. error message and abort when invoked.  These required functions are:
  405.  
  406.           xpr_fopen(), xpr_fclose(), xpr_fread(), xpr_fwrite(),
  407.           xpr_fseek(), xpr_sread(), xpr_swrite(), and xpr_update()
  408.  
  409.      The xpr_update() function provides many data fields for your comm
  410. program to potentially display to the user.  These are the XPR_UPDATE
  411. struct elements which XPRZModem will keep updated during transfers:
  412.  
  413.           xpru_protocol, xpru_filename, xpru_filesize, xpru_msg,
  414.           xpru_errormsg, xpru_blocks, xpru_blocksize, xpru_bytes,
  415.           xpru_errors, xpru_timeouts, xpru_blockcheck, xpru_expecttime,
  416.           xpru_elapsedtime, and xpru_datarate
  417.  
  418.      As you can see, XPRZModem tries to provide as many status fields as
  419. possible.  Although all of them are useful, the ones which are most
  420. important to ZModem users are filename, filesize, msg and/or errormsg, and
  421. bytes.  Please try to provide at least these fields in your status display,
  422. plus as many of the rest as you can manage.
  423.  
  424.      Although only the XPR callback functions listed above are crucial for
  425. XPRZModem, almost all of them are used if they are provided.  Although
  426. XPRZModem will function without any of the other routines, its performance
  427. or capabilities may be degraded somewhat.  Specifically, this is what you
  428. give up if you choose not to supply any of these other XPR callback
  429. functions:
  430.  
  431.           xpr_sflush(): Used when performing error recovery and resync
  432.                when sending files.  If not provided, extra timeout errors
  433.                and delayed error recovery will be likely.  The files will
  434.                still be transferred properly, but errors will degrade
  435.                overall throughput more than usual.
  436.  
  437.           xpr_chkabort(): Called between sending or receiving packets.
  438.                If not provided, there's no way for your comm program user
  439.                to abort a transfer in progress except by trying to somehow
  440.                force it to decide to give up and abort on its own, such as
  441.                by turning off the modem and hoping the protocol will abort
  442.                after enough timeouts (it will, eventually...).
  443. |---
  444. |           xprzmodem.library supports several levels of abort. Sending
  445. |           an abort code > 0 will skip the current file, a code < 0
  446. |           will abort the entire file transfer.
  447. |---
  448.            xpr_gets(): Called to prompt the user interactively for options
  449.                when your comm program invokes XProtocolSetup() with a null
  450.                xpr_filename field (if xpr_options() isn't available
  451.                instead).  If not provided, you'll have to prompt
  452.                the user for the options string yourself, and pass this
  453.                string in xpr_filename when invoking XProtocolSetup().
  454.  
  455.            xpr_setserial(): Called to obtain the current serial port
  456.                settings, and to change the serial port to 8N1 if it's not
  457.                already set that way.  If not provided, XPRZModem will
  458.                assume all transfers are being done at 2400 bps, which
  459.                won't hurt anything, and your users will have to make sure
  460.                that the serial port is set to 8N1 themselves.
  461.  
  462.            xpr_ffirst() and xpr_fnext(): If either of these routines are
  463.                missing, XPRZModem will lose the ability to send multiple
  464.                files in a batch.  The xpr_filename pointer passed to
  465.                XProtocolSend() will be assumed to point to the actual full
  466.                filename of the single file to be sent in this batch.  If
  467.                both of these routines are provided, XPRZModem will rely
  468.                upon them completely to obtain the names of the files to
  469.                send, and the xpr_filename pointer will not be used for any
  470.                purpose by XPRZModem except to be passed to ffirst/fnext.
  471.                This gives your comm program a way to send not just a single
  472.                filename template's worth of files in a batch, but a list of
  473.                different filenames.  If, for example, you set xpr_filename
  474.                to point to the first node of a linked list of filenames
  475.                and/or templates to be sent, rather than just having it
  476.                point to a string, you can have your ffirst and fnext
  477.                routines traverse this linked list in order to determine the
  478.                next file to be sent.  Or you could have xpr_filename point
  479.                to a buffer containing a list of filenames separated by
  480.                commas, and your ffirst/fnext routines could return each
  481.                filename in this list in turn.  The key here is that if you
  482.                provide these two routines, you're in complete control over
  483.                the series of names fed to XProtocolSend.  If you omit these
  484.                routines, XPRZModem is stuck with single-file mode.  Once
  485.                again, if these two routines are provided, XPRZModem will
  486.                *always* call them; it makes no attempt to use the
  487.                xpr_filename pointer for anything itself.  This is not
  488.                explicitly spelled out in the XPR standard, but it seems the
  489.                only reasonable way to handle batch protocols to me.
  490.                Hopefully other XPR library authors will follow this
  491.                precedent as well, so that comm program authors will be able
  492.                to count on multiple-filename batch sessions being handled
  493.                properly.
  494.  
  495.            xpr_finfo(): Used to determine the filesize of files being sent,
  496.                in order to tell the receiving system how big they are.
  497.                Also used to determine the size of a file which already
  498.                exists when in Overwrite Resume mode; XPRZModem must be able
  499.                to get the size of the current portion of the file in order
  500.                to be able to tell the sender where to resume sending from.
  501.                If this routine isn't provided, Overwrite Resume mode is
  502.                not allowed.  This routine is also used to check if Text
  503.                mode should be set to Y or N for each file when option TC
  504.                is set.
  505.                
  506.            xpr_options(): If you don't supply this, users will be stuck
  507.                with setting the library options via the semi-cryptic text
  508.                string method (ENV: and/or xpr_gets()).  This routine and
  509.                xpr_update() have a lot to do with the look and feel of your
  510.                program when using XPR libraries; any skimping on these two
  511.                routines will be painfully obvious to the user.  Conversely,
  512.                doing a nice job on these two routines will really make your
  513.                program shine.
  514.  
  515.            xpr_unlink(): Required by the DY and KN options, so if you don't
  516.                supply it, those options are not allowed.
  517.  
  518.  
  519.  
  520. 8.  The future
  521. --------------
  522.  
  523.      I don't want or expect this to be the last or only XPR ZModem library
  524. available.  There are a lot of less-commonly-used ZModem features which
  525. have popped up over the past few years, and many people might like to see
  526. some of them made available.  Such as 32-bit CRC (although I consider
  527. CRC-16 perfectly adequate for the max 1K packets sent by ZModem), full
  528. control-character escaping, or maybe 8th bit escaping to allow use of 7-bit
  529. serial channels.  I didn't want to add a bunch of rarely-used bells and
  530. whistles to this version of the library, because I want it to be able to
  531. serve as comprehensible example code.  I just want to provide a good solid
  532. ZModem which reliably handles the majority of people's needs.  Hopefully,
  533. this will serve as a foundation for future enhanced versions, while
  534. providing a safe fallback for people to come back to if that fancy new
  535. enhanced version (with neo-maxi zoomed weebies) turns out to need some more
  536. debugging.
  537.    
  538.      Bug reports, questions, or comments may be sent to me at:
  539.  
  540.           BIX: rahuebner
  541.           Compu$erve: 73105,1022
  542.  
  543.      Or, if you think it's important, and you want an answer in less than a
  544. week or two, call my BBS:
  545.  
  546.           The Wind Dragon Inn
  547.           1-402-291-8053, 300-9600+ bps, HST/V.32/V.42
  548.        or 1-402-291-3636, 300-2400 bps
  549.  
  550.      I check the messages on my BBS fairly often, so that's where to
  551. get ahold of me quick.  I'll also try and stock the latest XPR standard
  552. spec and XPR libraries there.
  553.  
  554. |---
  555. |    Any comments about the version 2.50 to 2.52 update code may be
  556. |    directed to me, William M. Perkins on BIX, with mail sent to
  557. |     wmperkins.
  558. |--- 
  559.  
  560. |---
  561. |    Any comments on v2.54 should be sent to olsen@sourcery.han.de,
  562. |    or if you prefer snail mail:
  563. |
  564. |        Olaf Barthel
  565. |        Brabeckstrasse 35
  566. |        D-30559 Hannover
  567. |        Federal Republic of Germany
  568. |---
  569.  
  570. 9.  The past (revision history)
  571. -------------------------------
  572. 1.0, 29 July 89:  Original release.
  573.  
  574.  
  575.  
  576. 1.1, 3 August 89:  Fixed zsdata() to send file data packet in one swrite()
  577. call instead of calling zsendline for every byte, to prevent hammering the
  578. serial.device with single-byte write requests during uploads, and to speed
  579. up effective data transmission rates.
  580.  
  581.  
  582.  
  583. 2.0, 28 October 89:  Converted from Manx to Lattice C 5.04.  Created
  584. prototypes and made other tweaks as required.  Designed new library skeleton
  585. for Lattice code, replacing the old Manx library skeleton.  Added new
  586. options TC, A, D, K, S, R, and P.  Added support for xpr_options() callback
  587. routine, and generally brought things up to par with XPR Spec 2.0.
  588.  
  589.  
  590.  
  591. 2.10, 12 February 91: Fixed the following generally minor problems:
  592.  
  593.   No longer munges A6 register (this was potentially serious), and added
  594. callback glue to ensure comm program can't munge OUR registers either.
  595. Decided that the protective glue was much safer than the more elegant direct
  596. invocation used in version 2.0.
  597.  
  598.   Slightly less transmission overhead (concatenates all output into single
  599. swrites, builds output packets a bit faster).
  600.  
  601.   Considerably less receive overhead; does a lot more waiting and a lot
  602. fewer sreads, especially at high speed.  WARNING: this change doesn't work
  603. with VLT version 4.846 or earlier (yes, Willy; it really was broken B-)).
  604. This change may or may not actually do you any good, depending upon how
  605. your comm program implements the xpr_sread() function.
  606.  
  607.   Fixed problems getting synchronized with some systems on uploads.
  608.  
  609.   No longer closes files twice.
  610.  
  611.   Now uses fully-reentrant sprintf() from amiga.lib; no more nasty BSS.
  612.  
  613.   A couple of obscure error messages were > 50 bytes long, causing problems
  614. with some comm program's transfer status windows, e.g. the infamouse VLT
  615. "Incredible Shrinking Status Window."
  616.  
  617.   Stabilized spastic data rate by computing elapsed time more accurately.
  618.  
  619.   Fixed sprintf() error which caused invalid filelength to be sent on uploads.
  620.  
  621.   Aligned all data for optimal performance on 68030++ CPUs (now that I have
  622. my A3000... B-)).  Doesn't really make any noticeable difference, but it
  623. makes us 68030 owners feel better anyway.  I'm also including a version of
  624. the library compiled for the 68020+ CPU, on the same principle.
  625.  
  626.   Now uses .DUP2 instead of .DUP.DUP, etc.
  627.  
  628.   Added config option E for number of errors which cause an abort.
  629.  
  630.   Fixed bogus IO_Torture false alarm concerning timer.device.
  631.  
  632.   Tried to fix an elusive Enforcer hit on reading location 0, but I'm not
  633. sure I really got it, since I had trouble reproducing the problem.
  634.  
  635. |---
  636. |    2.52 version, 6 March 1992: Recompile code for 68020 library code.
  637. |    Non-68020 code worked fine but John Tillema was not able to test
  638. |    the 2.51 68020 version.
  639. |
  640. |    2.51 version, 29 January 1992: Rxtimeout changed from 600 to 300
  641. |    for upload timeout problem by John Tillema.
  642. |
  643. |    2.50 version, 15 November 1991:  Added code to support 32 bit CRC
  644. |    (Circular Redundency Check).  CRC-32 adds a little more protection
  645. |    to the data being sent and received than does CRC-16.  Source for
  646. |    the CRC-32 additions came from the Unix version of RZ/SZ by Chuck
  647. |    Forsberg.
  648. |
  649. |    Added code to update_rate() function in utils.c to avoid the
  650. |    Guru # 80000005 if you decide to adjust the system clock during an 
  651. |    upload or download from Daylight Saving Time to Standard Time.  :-)
  652. |
  653. |    Proto additions using libinit.o and libent.o, and eliminating all
  654. |    of the assembler code was supplied by Jim Cooper of SAS.  Jim
  655. |    also supplied the mysprintf() code to replace sprintf().  This
  656. |    version of XprZmodem can be compiled with the SAS version 5.10 C 
  657. |    Compiler.  I do not know how well it might compile with the Aztec
  658. |    compiler.
  659. |
  660. |    THINGS TO DO
  661. |
  662. |    - Preserve date of file being transfered.
  663. |
  664. |    - Investigate possibility of saving file protection bits.
  665. |
  666. |    - Work out ways to increase the transfer speed.
  667. |
  668. |    - Additional changes as time and others may suggest.  :-)
  669. |
  670. |    -WMP-
  671. |---
  672.  
  673. |---
  674. |    Version 2.54, 28 June 1993, by Olaf `Olsen' Barthel: Got rid of the
  675. |    timer.c code, added OS 2.0 dependencies, rewrote update_rate() to
  676. |    display only the information which was really available, added
  677. |    control-code escaping & run-length encoding, changed the abort
  678. |    routine to pay attention to the different abort levels, removed
  679. |    SAS/C library dependencies (octal conversion, etc.), added
  680. |    support to transfer proper file creation date and access
  681. |    permission bits. The library texts were localized.
  682. |---
  683.